package testDao;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import bean.GebruikerBean;
import dao.GebruikerDao;
import db.BuildDB;
import db.DBManager;
import exceptions.GebruikerBestaatAlException;
import exceptions.GebruikerBestaatNietException;

public class testGebruikersDao
{

	private static DBManager manager;
	private static GebruikerDao dao;

	@BeforeClass
	public static void setUpBeforeClass()
	{
		manager = DBManager.getInstance();
		BuildDB.dropTables();
		BuildDB.buildTables();
		dao = new GebruikerDao(manager);
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception
	{
		BuildDB.dropTables();
	}

	@Test
	public void testAddGebruiker()
	{
		try
		{
			dao.addGebruiker("Piet", "Pietlaan 123", "1-1-2011",
					"piet@gmail.com", "123");
		} catch (GebruikerBestaatAlException e)
		{
			e.printStackTrace();
		}
		GebruikerBean gebruiker = null;
		try
		{
			gebruiker = dao.getGebruiker("piet@gmail.com");
		} catch (GebruikerBestaatNietException e)
		{
			System.out.println("testAddGebruiker failure");
		}
		assertEquals("Piet", gebruiker.getNaam());
	}

	@Test
	public void testAddDoubleGebruiker()
	{
		boolean exceptionThrown = false;
		try
		{
			dao.addGebruiker("Joon", "Joonlaan 123", "1-1-2011",
					"Joon@gmail.com", "123");
			dao.addGebruiker("Joon2", "Joonlaan 123", "1-1-2011",
					"Joon@gmail.com", "123");
		} catch (GebruikerBestaatAlException e)
		{
			exceptionThrown = true;
		}
		assertEquals(true, exceptionThrown);
	}

	@Test
	public void testAddMultiGebruiker()
	{
		try
		{
			dao.addGebruiker("Gert", "Gertensteeg 001", "11-11-1993",
					"gert@gmail.com", "wachtwoord");
			dao.addGebruiker("Jan", "Janpad 456", "2-1-1975", "jan@gmail.com",
					"hunter2");
			dao.addGebruiker("Kees", "Keestraat 789", "12-12-1789",
					"kees@gmail.com", "kees");
		} catch (GebruikerBestaatAlException e)
		{
			e.printStackTrace();
		}
		GebruikerBean gebruiker = null;
		try
		{
			gebruiker = dao.getGebruiker("gert@gmail.com");
		} catch (GebruikerBestaatNietException e)
		{
			e.printStackTrace();
		}
		assertEquals("Gert", gebruiker.getNaam());
	}

	@Test
	public void testDelGebruiker()
	{
		try
		{
			dao.addGebruiker("Bert", "Bertlaan 123", "1-1-2011",
					"bert@gmail.com", "123");
		} catch (GebruikerBestaatAlException e)
		{
			e.printStackTrace();
		}

		GebruikerBean gebruiker = null;
		try
		{
			gebruiker = dao.getGebruiker("bert@gmail.com");
		} catch (GebruikerBestaatNietException e1)
		{
			e1.printStackTrace();
		}
		dao.deleteGebruiker(gebruiker.getId());

		boolean gebruikerBestaatNiet = false;
		try
		{
			gebruiker = dao.getGebruiker("bert@gmail.com");
		} catch (GebruikerBestaatNietException e)
		{
			gebruikerBestaatNiet = true;
		}
		assertEquals(true, gebruikerBestaatNiet);
	}

	@Test
	public void testLogin()
	{
		try
		{
			dao.addGebruiker("Freddie", "Vudstraat 30", "01-01-2001",
					"frud@gmail.com", "123");
		} catch (GebruikerBestaatAlException e)
		{
			e.printStackTrace();
		}
		boolean succes = false;
		try
		{
			dao.logIn("frud@gmail.com", "123");
			succes = true;
		} catch (GebruikerBestaatNietException e)
		{
			e.printStackTrace();
		}
		assertTrue(succes);
	}

	@Test
	public void testWrongLogin()
	{
		try
		{
			dao.addGebruiker("Gurdie", "Vudstraat 30", "01-01-2001",
					"gurd@gmail.com", "123");
		} catch (GebruikerBestaatAlException e)
		{
			e.printStackTrace();
		}
		boolean succes = false;
		try
		{
			dao.logIn("gurd@gmail.com", "446");
		} catch (GebruikerBestaatNietException e)
		{
			succes = true;
		}
		assertTrue(succes);
	}

}
